<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 一.new 的使用 ？
        // 1.实例化对象 
        // function Person(name){
        //     this.name = name;
        //     // 隐式返还了this
        //     // return this;  //系统帮你自动返还了
        //     // return {hello:"123"};
        // }

        // var zhangsan = new Person("张三");
        // console.log(zhangsan);

        // 2.执行函数

        // function fn(){
        //     console.log("fn");
        // }

        // fn();
        // new fn();
        // new fn;


        // 二 、new 做了什么？

        /* 
            1.创建一个空的简单 JavaScript 对象（即 {}）；
            2.为步骤 1 新创建的对象添加属性 __proto__，将该属性链接至构造函数的原型对象；
            3.将步骤 1 新创建的对象作为 this 的上下文；
            4.如果该函数没有返回对象，则返回 this。
        */

        // 实现一个mynew

        function Person(name){
            this.name = name;
            // return {hello:123};
        }

        Person.prototype.fn = function(){
            console.log("fn");
        }

        function mynew(fn,...args){
            var obj  = {};  // 1.创建一个空对象
            obj.__proto__ = fn.prototype;  // 2.把构造函数的原型赋值给 空对象的隐式原型
           var res =  fn.call(obj,...args);  // 3.把空对象改成 构造函数的this;
            if(typeof res !== "object"){ //4. 如果构造函数返还的不是一个对象 那么就返还this，也就是这边的obj。如果构造函数返还的是一个对象 ，那么直接返还这个对象 ；
                return obj;
            }else{
                return res;
            }
        }

        var zhangsan = mynew(Person,"张三");
        console.log(zhangsan);
        zhangsan.fn();






    </script>
</body>
</html>